約 4,760,808 件
https://w.atwiki.jp/bambooflow/pages/65.html
SystemCコンパイルのためのGNU-Makefile書き方メモ 書き方なんてひとそれぞれですが、以外とMakefile書くのも面倒なのでメモ書きします. コンパイルするときは、ここからコピペで使用すればOK. SystemCコンパイルのためのGNU-Makefile書き方メモ単純なコンパイル方法 シンプルなMakefile Makefile.defsを利用するMakefile.defs Makefile 作業ディレクトリ構成 お気に入りMakefileメモ 単純なコンパイル方法 test.cpp1つをコンパイルする方法。 $ g++ -I/usr/local/systemc-2.2/include -c test.cpp $ g++ -I/usr/local/systemc-2.2/lib-linux -lsystemc -lm -o run.x test.o シンプルなMakefile メイクファイルは以下のように用意する。 CC = g++ SYSTEMC = /usr/local/systemc-2.1 INCDIR = -I. -I$(SYSTEMC)/include LIBDIR = -L. -L$(SYSTEMC)/lib-linux LIBS = -lsystemc -lm CFLAGS = -O2 -Wall TARGET = run.x SRCS = adder.cpp tb.cpp main.cpp OBJS = $(SRCS .cpp=.o) all $(TARGET) $(TARGET) $(OBJS) $(CC) -o $@ $(LIBDIR) $(LIBS) $(OBJS) .cpp.o $(CC) $(CFLAGS) $(INCDIR) -c $ clean @rm -f *.o $(TARGET) 環境等で変更が必要なのは、"SYSTEMC"のライブラリの場所指定と、"SRCS"のコンパイルするファイル指定の箇所。 Makefile.defsを利用する メイクファイルからMakefile.defsをインクルードして使う方法がある。 Makefile.defは展開したsystemc-2.2.0.tgzの以下にある。 systemc-2.2.0/examples/sysc/Makefile.defs これを利用すればメイクファイルの共通した記述を省略できる。 Makefile.defs Makefile.defsは以下のようになっている。 Makefile.defs SYSTEMC = /usr/local/systemc-2.2 INCDIR = -I. -I$(SYSTEMC)/include LIBDIR = -L. -L$(SYSTEMC)/lib-$(TARGET_ARCH) LIBS = -lsystemc -lm $(EXTRA_LIBS) EXE = $(MODULE).x .SUFFIXES .cc .cpp .o .x $(EXE) $(OBJS) $(SYSTEMC)/lib-$(TARGET_ARCH)/libsystemc.a $(CC) $(CFLAGS) $(INCDIR) $(LIBDIR) -o $@ $(OBJS) $(LIBS) 2 1 | c++filt .cpp.o $(CC) $(CFLAGS) $(INCDIR) -c $ .cc.o $(CC) $(CFLAGS) $(INCDIR) -c $ clean rm -f $(OBJS) *~ $(EXE) core ultraclean clean rm -f Makefile.deps Makefile.deps # $(CC) $(CFLAGS) $(INCDIR) -M $(SRCS) Makefile.deps #include Makefile.deps 環境等で変更が必要なのは、"SYSTEMC"のライブラリの場所指定。 Makefile 追加するメイクファイルは以下のようにする。 Makefile(例) CC = g++ CFLAGS = -Wall -g EXTRA_LIBS = -O2 TARGET_ARCH = linux # target name MODULE = run SRCS = test.cpp OBJS = $(SRCS .cc=.o) include ../Makefile.defs 作業ディレクトリ構成 作業ディレクトリは以下のようになる。 Sysc/ |-- Makefile.defs # 共通して使う |-- sample01 | |-- Makefile # sample01用に作成 | |-- test.cpp |-- sample02 | |-- Makefile # sample02用に作成 | |-- test.cpp `-- sample03 ・・・ お気に入りMakefileメモ とりあえず、コンパイルしたい場合は、下記のMakefileで十分かと。 make all を実行すると、$(wildcard *.cpp)によりmakeを実行したディレクトリ上の.cppファイルを探してコンパイルします。 コンパイルが完了すると、TARGET名であるrun.x実行ファイルができあがります。 オブジェクトファイル(.o)はobjsディレクトリに生成されるようにしました。 そのほうがすっきりするので。 ###################################################################### # SystemC Makefile ###################################################################### CXX = g++ TARGET = run.x OBJDIR = objs # coverage option #GCOV_OPT = -coverage # Source File SRCS = $(wildcard *.cpp) OBJS = $(SRCS .cpp=.o) OBJS = $(addprefix $(OBJDIR)/,$(OBJS)) ###################################################################### # SystemC setting SYSTEMC = /usr/local/systemc-2.2.0 SYSC_INC = -I. -I$(SYSTEMC)/include SYSC_LIB = -L. -L$(SYSTEMC)/lib-linux -lsystemc ###################################################################### # Compile option setting CXXFLAGS = -O2 -Wall CXXFLAGS += $(GCOV_OPT) CXXFLAGS += $(SYSC_INC) CXXLIBS = -lm CXXLIBS += $(SYSC_LIB) ###################################################################### # Compile setting all $(TARGET) $(TARGET) $(OBJS) $(CXX) $(GCOV_OPT) -o $@ $^ $(CXXLIBS) $(OBJDIR)/%.o %.cpp @[ -d $(OBJDIR) ] || mkdir -p $(OBJDIR) $(CXX) -c $(CXXFLAGS) -o $@ $ clean rm -f *~ $(OBJDIR)/*.o $(TARGET) 昔は、.cpp.o を使うようでしたが、最近では%.o %.cppを使うみたいです。 あと、カバレッジのオプションを付けてみました.(-coverage) 実行する際は、最適化オプション(-O)ははずしたほうがよいです。 古いコンパイラだとだと、-fprofile-arcs -ftest-coverageでしょうか。 gcov xxx.gcda 以上
https://w.atwiki.jp/bambooflow/pages/113.html
SystemCの検証環境モデル構成 SystemCの検証環境モデル構成1.小規模なモデルテストサンプルプログラム 2.中規模なモデルテストサンプルプログラム 3.大規模なモデルテストサンプルプログラム おそらく3.のモデル構成が多くに記述する形になる。 1.小規模なモデルテスト 比較的小さなモデルの検証をしたいときのモデル構成。 #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (verif_model_s.png) sc_mainのところで、 検証モデルのオブジェクトを実体化 クロック信号を生成、接続 入出力信号の接続 テストパタン用意 シミュレーション時間の更新 必要があれば、テストパタン用意、時間更新を繰り返す。 をする。 メインとモデルの2ファイルで済む。 しかし、シミュレーションがしにくかったり拡張しにくかったりする。 サンプルプログラム template_s.tgz 階層構造 sc_main |== myModel(MyModel) MyModel機能クロックなし 4つの値を入力(in_a, in_b, in_c, in_d) 合計出力(out_total) 平均出力(out_ave) 最小値出力(out_min) 最大値出力(out_max) 2.中規模なモデルテスト モデルが複雑になり、テストパタンが大きくなったとき、 別にテストベンチを用意して検証を実施するようなモデル構成。 #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (verif_model_m.png) sc_mainでは、 モデルの実体化 テストベンチの実体化 クロック信号生成、接続 モデル間信号接続 シミュレーション開始sc_start() をする。 シミュレーションの終了は、テストベンチのプロセス内にsc_stop()を入れて、必要なタイミングで終了するようにする。 テストモデルとテストベンチとメインで構成する。 メインプログラムに接続等を記述するので、環境を移動させるのが難がある。 サンプルプログラム template_clk_m.tgz 階層構造 sc_main |== myModel(MyModel) |== testBench(TestBench) MyModel機能クロック動作 4つの値を入力(in_a, in_b, in_c, in_d) 合計出力(out_total) 平均出力(out_ave) 最小値出力(out_min) 最大値出力(out_max) 3.大規模なモデルテスト 検証環境が複雑になったときのモデル構成。 テストベンチとモデルの上にトップモジュールをおく。 #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (verif_model_l.png) sc_mainでは、 TOPモジュールの実体化 シミュレーション開始sc_start() TOPモジュールでは、 モデルの実体化 テストベンチの実体化 クロック信号生成、接続 モデル間信号接続 をする。 ファイルが多くなって複雑にみえるかもしれないが、一度覚えてしまえばモデル追加や検証するのが容易。 この形は、sc_mainで1つのオブジェクト(TOPモジュール)を実体化するだけで済むので、規模の小さいモデル構成でもはじめからこの形にしたほうがよい。 サンプルプログラム template_clk_l.tgz 階層構造 sc_main |== syscTop(SyscTop) |== myModel(MyModel) |== testBench(TestBench) MyModel機能クロック動作 4つの値を入力(in_a, in_b, in_c, in_d) 合計出力(out_total) 平均出力(out_ave) 最小値出力(out_min) 最大値出力(out_max)
https://w.atwiki.jp/bambooflow/pages/127.html
SystemC マクロ SystemCライブラリのマクロについて、メモ書き。 こんなのがあるよ、っていうのを一覧。とくに説明はかかない。 SC_INCLUDE_FX SC_INCLUDE_DYNAMIC_PROCESSES SC_USE_SC_STRING_OLD このマクロが有効のとき、sc_string を sc_string_old と定義 SC_USE_STD_STRING このマクロが有効のとき、sc_string を std string と定義 SC_FX_EXCLUDE_OTHER SC_STOP_FINISH_DELTA SC_USE_PTHREADS SC_DT_MIXED_COMMA_OPERATORS SC_DT_DEPRECATED SC_ENABLE_OBSERVERS SC_MAX_NBITS SC_SIGNED SC_UNSIGNED SC_REPORT_ERROR() SC_REPORT_WARNING SC_REPORT_INFO() SC_DEFINE_MESSAGE SC_HAS_PROCESS SC_ASSERT_ SC_FXNUM_OBSERVER_READ_ SC_FXNUM_OBSERVER_WRITE_ SC_FXNUM_FAST_OBSERVER_READ_ SC_FXNUM_FAST_OBSERVER_WRITE_ SC_FXDIV_WL SC_ASSERT_
https://w.atwiki.jp/bambooflow/pages/135.html
クロックカウンタを作る ここでは、クロックカウンタを作成することで、モジュール作成、プロセスの作成等について説明する。 クロックカウンタを作るサンプル コンパイル/実行実行結果 モデル説明階層構造 クロックカウンタ・入出力信号 ソースコード内容ClcokCounter.h ClockCounter.cpp main.cpp サンプル clock_counter.tgz main.cpp ClockCounter.h ClockCounter.cpp Makefile コンパイル/実行 $ make == コンパイル $ ./run.x == シミュレーション実行 実行結果 SystemC 2.2.0 --- Jun 28 2008 10 19 12 Copyright (c) 1996-2006 by all Contributors ALL RIGHTS RESERVED Note VCD trace timescale unit is set by user to 1.000000e-09 sec. 0 s CntOut = 0 10 ns CntOut = 1 60 ns CntOut = 6 195 ns CntOut = 20 232 ns CntOut = 24 732 ns CntOut = 74 実行すると10nsごとにCntOutが1加算されている。 クロックは、10nsの周期となっている。 モデル説明 階層構造 sc_main |=== clockCounter(ClockCounter) クロックカウンタ・入出力信号 方向 型 信号名 説明 input bool clk クロック入力 output unsigned int CntOut クロックカウント値出力 ソースコード内容 ClcokCounter.h #ifndef __CLOCK_COUNTER_H #define __CLOCK_COUNTER_H #include systemc.h SC_MODULE( ClockCounter ) { //-- ports ----------------------------------------------------// sc_in_clk clk; sc_out unsigned int CntOut; //-- signals --------------------------------------------------// //-- variables ------------------------------------------------// //-- process functions ----------------------------------------// void main_thread(); //-- functions ------------------------------------------------// // constructor SC_HAS_PROCESS( ClockCounter ); ClockCounter( sc_module_name ); }; #endif /* __CLOCK_COUNTER_H */ "#include systemc.h "でSystemCライブラリのヘッダをインクルード SC_MODULEにてClockCounterモジュールを定義 クロック信号clkを入力ポートとして定義 クロックカウント値を出力するためのCntOut信号を出力ポートとして定義 プロセス間数となるmain_proc関数を定義 コンストラクタを定義プロセスを持つモジュールのためSC_HAS_PROCESSを定義 ClockCounter.cpp #include "ClockCounter.h" // constructor ClockCounter ClockCounter( sc_module_name name ) sc_module( name ) , clk( "clk" ) , CntOut( "CntOut" ) { // process setting SC_THREAD( main_thread ); //sensitive clk.pos(); } void ClockCounter main_thread() { unsigned int cnt = 0; CntOut.write( 0 ); while (true) { //wait(); wait( clk.posedge_event() ); ++cnt; CntOut.write( cnt ); } } コンストラクタ記述内SC_MODULEによりsc_moduleを継承するので、sc_moduleの初期化を記述 main_proc関数をSC_THREADに指定 プロセス関数main_proc記述内クロックカウント値を保持する変数cntを用意、初期値ゼロに設定 CntOut信号の出力を初期値ゼロに設定 無限ループ*while(true))を記述wait関数によりクロックの立上りを待つ カウント値のインクリメントしたらCntOutへ出力 main.cpp #include systemc.h #include "ClockCounter.h" int sc_main( int argc, char* argv[] ) { ClockCounter *clockCounter; // signals sc_clock clk( "clk", 10.0, SC_NS ); sc_signal unsigned int CntOut; // module instance binding clockCounter = new ClockCounter( "ClockCounter" ); sc_assert( clockCounter ); clockCounter- clk( clk ); clockCounter- CntOut( CntOut ); ///////////////////////////////////////////////////////////////////////// // vcd dump sc_trace_file *trace_f; trace_f = sc_create_vcd_trace_file( "systemc" ); // 出力フェイル名を指定する sc_assert( trace_f ); trace_f- set_time_unit( 1.0, SC_NS ); sc_trace( trace_f, clk, "clk" ); sc_trace( trace_f, CntOut, "CntOut" ); ///////////////////////////////////////////////////////////////////////// // initialize sc_start( SC_ZERO_TIME ); cout sc_time_stamp() " " "CntOut = " CntOut.read() endl; // simulation sc_start( 10.0, SC_NS ); cout sc_time_stamp() " " "CntOut = " CntOut.read() endl; sc_start( 50.0, SC_NS ); cout sc_time_stamp() " " "CntOut = " CntOut.read() endl; sc_start( 135.0, SC_NS ); cout sc_time_stamp() " " "CntOut = " CntOut.read() endl; sc_start( 37.0, SC_NS ); cout sc_time_stamp() " " "CntOut = " CntOut.read() endl; sc_start( 500.0, SC_NS ); cout sc_time_stamp() " " "CntOut = " CntOut.read() endl; ///////////////////////////////////////////////////////////////////////// delete clockCounter; sc_close_vcd_trace_file( trace_f ); return 0; } systemc.hヘッダファイルをインクルード ClockCounter.hヘッダファイルをインクルード メイン関数としてsc_mainを使用 sc_clockによりクロックを作成、周期は10nsに設定 CntOut信号を受け取るsc_signalを用意 ClockCounterをインスタンスする clockCounterのclk,CntOut信号を接続 波形出力設定, ファイルはVCD形式,clk,CntOut信号を出力対象とする シミュレーション実行sc_start(SC_ZERO_TIME)ですべてのプロセスで最初のwaitまで実行 sc_start実行後、CntOut信号出力を表示、10nsごとに1カウント去れていることを確認
https://w.atwiki.jp/bambooflow/pages/140.html
SystemC 動的プロセスについて メソッドを動的にSC_METHODやSC_THREAD指定することが可能。 普通のモデリング時には必要ないが、応用的なことに使用することがある。 たとえば、デバッグ機能を追加したい、とか、検証機能を強化したい、とか。 以下にその方法をメモる。 SystemC 動的プロセスについて動的プロセスを扱うための準備 使用する関数 動的methodを指定する記述例 動的threadを指定する記述例 動的プロセスを扱うための準備 以下のようにsytemc.hをインクルードする前にSC_INCLUDE_DYNAMIC_PROCESSESを定義する必要がある。 #define SC_INCLUDE_DYNAMIC_PROCESSES #include systemc.h もしくは、コンパイルオプションの "-D"を使用する方法もある。 g++ -I/usr/local/systemc-2.2 -DSC_INCLUDE_DYNAMIC_PROCESSES -c model.cpp 使用する関数 sc_spawn プロセスを指定するときに使用する。 sc_bind プロセスとする関数を指定するときに使用する。 sc_bindはboost bindのdefine定義。 sc_spawn_options プロセスのオプション設定をする。たとえば、センシティブ指定とか。 戻り値なしで登録する場合 sc_process_handle hname = sc_spawn( /*void*/sc_bind( funcName, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); sc_process_handle hname = sc_spawn( /*void*/sc_bind( funcName, object, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); 戻り値ありで登録する場合 sc_process_handle hname = sc_spawn( returnVar, sc_bind( funcName, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); sc_process_handle hname = sc_spawn( returnVar, sc_bind( funcName, object, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); 動的methodを指定する記述例 #define SC_INCLUDE_DYNAMIC_PROCESSES #include systemc.h SC_MODULE( DUT ) { sc_in sc_uint 8 din1; sc_in sc_uint 8 din2; sc_out sc_uint 9 dout; SC_CTOR( DUT ) { SC_THREAD( init_thread ); } void init_thread() { sc_spawn_options mth; mth.spawn_method(); mth.dont_initialize(); mth.set_sensitivity( din1 ); mth.set_sensitivity( din2 ); sc_spawn( sc_bind( DUT spawn_method0,this), "method0", mth ); } void spawn_method0() { dout.write( din1.read() + din2.read() ); } }; 注意として、sc_spawnの指定は、プロセス内に記述する。 コンストラクタに記述すると実行時エラーとなる。 動的threadを指定する記述例 #define SC_INCLUDE_DYNAMIC_PROCESSES #include systemc.h SC_MODULE( DUT ) { sc_in bool clk; SC_CTOR( DUT ) { SC_THREAD( run ); } void run() { sc_spawn_options opt; opt.set_sensitivity( clk.pos() ); sc_spawn( sc_bind( DUT spawn_thread,this, false ), "thread0", opt ); } void spawn_thread( bool flag ) { while (true) { ・・・ wait(); } } }; 動的プロセスでは引数を渡したり戻り値を受け取ったりするができる。 例では、bool型の引数を渡している。
https://w.atwiki.jp/bambooflow/pages/144.html
コアとなる言語クラス定義 コアとなる言語クラス定義ヘッダファイル コアクラス一覧 用意されたチャネルクラス定義チャネルクラス一覧 チャネル接続の対応表 ヘッダファイル SystemCを使うには次のヘッダファイルをインクルードする。 #include "systemc.h" #include "systemc.h" #include "systemc" #include "systemc" using sc_core sc_module; using sc_core sc_signal; using sc_core SC_NS; using sc_core sc_start; using sc_dt sc_logic; #include iostream using std ofstream; using std cout; using std endl; コアクラス一覧 sc_module sc_module_name sc_sensitive sc_spawn_optionsとsc_spawn sc_process_handle sc_event_finderとsc_event_finder_t sc_event_and_listとsc_event_or_list sc_evnet sc_time sc_port sc_export sc_interface sc_prim_channel sc_object sc_attr_base sc_attribute sc_attr_cltn 用意されたチャネルクラス定義 チャネルクラス一覧 sc_signal_in_if sc_signal_in_if<bool>とsc_signal_in_if<sc_dt sc_logic> sc_signal_inout_if sc_signal sc_signal<bool>とsc_signal<sc_dt sc_logic> sc_buffer sc_clock sc_in sc_in<bool>とsc_in<sc_dt logic> sc_inout sc_inout<bool>とsc_inout<sc_dt sc_logic> sc_out sc_signal_resolved sc_in_resolved sc_sc_inout_resolved sc_out_resolved sc_signal_rv sc_in_rv sc_inout_rv sc_out_rv sc_fifo_in_if sc_fifo_out_if sc_fifo sc_fifo_in sc_fifo_out sc_mutex_if sc_mutex sc_semaphore_if sc_semaphore sc_event_queue チャネル接続の対応表 入力 チャネル 出力 sc_port sc_signal_in_if X sc_signal X sc_buffer X sc_port sc_signal_out_if X sc_port sc_signal_inout_if X sc_port sc_signal_inout_if X sc_in X sc_out X sc_inout X sc_inout X sc_in bool sc_clock sc_in_resolved sc_signal_resolved sc_out_resolved sc_inout_resolved sc_inout_resolved sc_in_rv W sc_signal_rv W sc_out_rv W sc_inout_rv W sc_inout_rv W sc_port sc_fifo_in_if X sc_fifo X sc_port sc_fifo_out_if X sc_fifo_in X sc_fifo_out X X 型(bool,unsigned char,int,sc_uint , sc_int , etc.) W ビット幅 アクセス チャネル sc_port sc_mutex_if sc_mutex sc_port sc_semaphore_if sc_semaphore
https://w.atwiki.jp/bambooflow/pages/136.html
SystemC 並列処理動作について ここでは、SystemCの機能のひとつである並列処理動作について説明する。 2つのプロセスを作り、並列動作を体感してみる。 SystemC 並列処理動作についてサンプル プログラム 実行結果 説明 サンプル multi_process.tgz main.cpp Makefile プログラム main.cpp #include systemc.h SC_MODULE( MyModel ) { // constructor SC_CTOR( MyModel ) { SC_THREAD( thread0 ); SC_THREAD( thread1 ); } // process0 void thread0() { while (true) { cout "----thread0----------" endl; wait( 10.0, SC_US ); } } // process1 void thread1() { while (true) { cout "-----------thread1---" endl; wait( 10.0, SC_US ); } } }; int sc_main( int argc, char* argv[] ) { MyModel *myModel; // module instance myModel = new MyModel( "MyModel" ); sc_assert( myModel ); ///////////////////////////////////////////////////////////////////////// // initialize sc_start( SC_ZERO_TIME ); cout "now time is " sc_time_stamp() endl; // simulation sc_start( 10.0, SC_US ); cout "now time is " sc_time_stamp() endl; sc_start( 10.0, SC_US ); cout "now time is " sc_time_stamp() endl; sc_start( 100.0, SC_US ); cout "now time is " sc_time_stamp() endl; sc_start( 50.0, SC_US ); cout "now time is " sc_time_stamp() endl; ///////////////////////////////////////////////////////////////////////// delete myModel; return 0; } 実行結果 SystemC 2.2.0 --- Jul 1 2008 00 09 35 Copyright (c) 1996-2006 by all Contributors ALL RIGHTS RESERVED ----thread0---------- -----------thread1--- now time is 0 s now time is 10 us ----thread0---------- -----------thread1--- now time is 20 us -----------thread1--- ----thread0---------- -----------thread1--- ・・・ ----thread0---------- -----------thread1--- ----thread0---------- now time is 120 us ----thread0---------- -----------thread1--- ----thread0---------- ・・・ -----------thread1--- ----thread0---------- -----------thread1--- now time is 170 us 説明 このプログラムではMyModelというSC_MODULEを1つ定義してsc_main()でインスタンスしている。 このMyModelは2つのプロセスをもつ。プロセス名は、thread0とthread1。 この2つのプロセスは、シミュレーション開始(sc_start)とともに実行される。 ここで、注目してほしいことは、thread0とthread1はどちらもwhile(true){}の無限ループを構成していること。 SC_THREADの処理はwaitによりいったん停止することができる。 wait( 10.0, SC_US ); この記述は、ここで処理を一端停止し、シミュレーション時間が10us進んだらこのwaitを抜けて続きの処理をするものである。第1引数はdouble型、第2引数は時間の単位を指定する。 時間の単位はSC_SEC(秒)からSC_FS(フェムト秒)まで指定できる。 今回は、SC_US(マイクロ秒)を単位として指定した。 thread0とthread1のwaitの時間はともに10usなのでどちらの処理が先に実行されるかはわからない。 どちらが先に処理されるかの順番はSystemCでは保証されない。 実行結果をみるとsc_start()を実行するたびにthread0とthread1の実行の順番が入れ替わっていることに注目してほしい。 プロセスは、posixもしくはpthreadというCライブラリのスレッド・モデルを利用して実現しているようだ。
https://w.atwiki.jp/bambooflow/pages/132.html
SystemC Visual C++ Express Edition Visual C++ Express Editionでの実行の仕方とかをここにメモ書きとしてまとめる。 HelloWorldインストール
https://w.atwiki.jp/bambooflow/pages/121.html
SystemCの抽象度(抽象レベル) SystemCの抽象度(抽象レベル)TLM標準化団体ごとの抽象レベル定義OSCIが提唱する抽象レベル OCP-IPが提唱する抽象レベル GreenSocsが提唱する抽象レベル STARCが提唱する抽象レベル その他の抽象レベル TLM標準化団体ごとの抽象レベル定義 OSCIが提唱する抽象レベル PV(Programmers View) PVT(Programmers View with Timing) CC(Cycle Callable) OCP-IPが提唱する抽象レベル OCP/TL3(OCP Transaction Level 3) OCP/TL2(OCP Transaction Level 2) OCP/TL1(OCP Transaction Level 1) OCP/TL0(OCP Transaction Level 0) GreenSocsが提唱する抽象レベル PV(Programmers View) PVT(Programmers View with Timing) CC(Cycle Callable) RTL(Register Transfer Level) STARCが提唱する抽象レベル UTTR(Un-timed Transaction) ATTR(Approximately-timed Transaction) ATBP(Approxymately-timed Bus-Phase) CABC(Cycle-accurate Bus-Cycle) CABS(Cycle-accurate Bus-Signal) データの粒度とタイミング精度から抽象レベルを分類する。 その他の抽象レベル UTF(Untimed Functional)モデル TF(Timed Functional)モデル BCA(Bus Cycle Accurate)モデル CA(Cycle Accurate)モデル
https://w.atwiki.jp/bambooflow/pages/116.html
SystemCのエラボレーション・フェーズ SystemCのエラボレーション・フェーズ説明 実験 説明 エラボレーション・フェーズは、シミュレーション開始前のフェーズ。 ここでは、つぎの作業をしている データ構造の初期化 接続関係の構築もし、sc_in 、sc_out 等が接続されていない場合エラーを出力する 次の実行フェーズの前処理(end_of_elaboration) SystemCでは3つのフェーズが存在する。 エラボレーション・フェーズ 実行フェーズ クリーンアップ・フェーズ sc_start()が実行されると、まずエラボレーション・フェーズにはいる。 シミュレーションは実行フェーズである。 sc_start()から抜けるとクリーンアップ・フェーズにはいる。 sc_moduleには、次の4つのvirtual関数が存在する。 before_end_of_elaboration end_of_elaboration start_of_simulation end_of_simulation どのような順番で呼ばれるのか気になったので実験してみた。 実験 main.cpp #include systemc.h #include "mod.h" int sc_main( int argc, char* argv[] ) { MOD *mod; printf("main begin\n"); mod = new MOD( "mod" ); printf( "main exec sc_start\n" ); sc_start( -1 ); printf( "main end\n" ); return 0; } MOD.h #ifndef __MOD_H #define __MOD_H #include systemc.h SC_MODULE( MOD ) { SC_CTOR( MOD ) { printf( "mod constructor\n" ); SC_THREAD( thread_proc ); } ~MOD() { printf( "mod destructor\n" ); } void thread_proc() { printf( "mod exec sc_stop\n" ); sc_stop(); } void before_end_of_elaboration() { printf( "mod before_end_of_elaboration\n" ); } void end_of_elaboration() { printf( "mod end_of_elaboration\n" ); } void start_of_simulation() { printf( "mod start_of_simulation\n" ); } void end_of_simulation() { printf( "mod end_of_simulation\n" ); } }; #endif /* __MOD_H */ 実行結果 main begin mod consructor main exec sc_start mod before_end_of_elaboration mod end_of_elaboration mod start_of_simulation mod exec sc_stop SystemC simulation stopped by user. mod end_of_simulation main end sc_startが実行されると before_end_of_elaboration() エラボレーション実行 end_of_elaboration() start_of_simulation() シミュレーション開始 という順番で関数が呼ばれる。 sc_stopが実行されると end_of_simulation が実行され、sc_start()内の無限ループから抜けてsc_mainへ戻る。